#pragma once
#include <iostream>
#include <jsoncpp/json/json.h>
#include <sstream>
#include <memory>
#include "Log.hpp"
#include<random>
#include<sstream>
#include<atomic>
#include<iomanip>


using namespace std;
using namespace Log;
// 封装Jsoncpp的序列化函数
// 反序列化的英文是deserialization

namespace zgwrpc
{

    //序列化
    void Serialize(Json::Value &root, string &str)
    {

        stringstream ss;
        // Json化字符串类(Json::StreamWriter)需要使用StreamWriterBuilder类来初始化
        Json::StreamWriterBuilder builder;
        Json::StreamWriter *writer = builder.newStreamWriter();
        // 将Json::Value对象转换为JSON字符串并输出到cout
        // 也就是序列化的过程
        writer->write(root, &ss);
        string s=ss.str();
        str=s;
        delete writer; // 释放内存内部是new出来的对象
    }

    //反序列化
    bool Deserialize( string &str, Json::Value &root)
    {
        Json::CharReaderBuilder builder;
        unique_ptr<Json::CharReader> reader(builder.newCharReader());
        string errs;
        bool sucess = reader->parse(str.c_str(), str.c_str() + str.length(), &root, &errs);
        if (!sucess)
        {
            LOG(LogLevel::ERROR)<<"Deserialize error: "<<errs;
            return false;
        }
        return true;
    }


    //Uuid生成类
    class Uuid
    {
    public:
        std::string Getid()
        {
            std::stringstream ss;
            // 构造一个机器随机数对象
            std::random_device rd;

            // 以机器随机数为种子构造随机数对象
            std::mt19937 gen(rd());

            // 构造限定数据范围对象
            std::uniform_int_distribution<int> distribution(0, 255);

            // 生成8个随机数，按照特定格式组织成为16进制字符串                32位
            for (int i = 0; i < 8; i++)
            {
                if (i == 4 || i == 6)
                    ss << "-";
                ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gen);
            }
            ss << "-";

            static std::atomic<size_t> seq(1);
            size_t cur = seq.fetch_add(1);
            for (int i = 7; i >= 0; i--)
            {
                if (i == 5)
                    ss << "-";
                ss << std::setw(2) << std::setfill('0') << std::hex << (cur >> (i * 8));
            }
            // 输出16进制字符串
            return ss.str();
        }
    };
}
